package main.Daoimpl;

import main.JdbcUtils;
import org.apache.commons.dbutils.QueryRunner;
import org.apache.commons.dbutils.handlers.BeanHandler;
import org.apache.commons.dbutils.handlers.BeanListHandler;

import java.sql.Connection;
import java.sql.SQLException;
import java.util.List;

/**
 * 作者: ALIM-MASTIK
 * 创建实现: 2023/7/15 9:51
 * 项目名称：chat
 * 软件: IntelliJ IDEA
 */
public abstract class BaseDao {
    private QueryRunner queryRunner = new QueryRunner();

    /**
     * @param sql  执行的sql语句
     * @param args sql对应的参数值
     * @return 如果执行Insert/Update/Delete操作成功并影响了行数，将返回受影响的行数（一个正整数）。如果操作失败，包括数据库写入失败或执行Update操作时出现异常，将返回-1作为失败的标识。
     */
    public int update(String sql, Object... args) {
        Connection connection = JdbcUtils.getConnection();
        try {
            return queryRunner.update(connection, sql, args);
        } catch (SQLException e) {
            e.printStackTrace();
        } finally {
            JdbcUtils.close(connection);
        }
        return -1;
    }

    /**
     * 查询返回一个javaBean的sql语句
     *
     * @param type 返回的对象类型
     * @param sql  执行的sql语句
     * @param args sql对应的参数值
     * @param <T>  返回的类型的泛型
     * @return 如果查询成功并返回一个JavaBean对象，将返回该对象。如果查询失败，包括数据库读取失败或执行查询操作时出现异常，将返回null作为失败的标识。
     */
    public <T> T queryForOne(Class<T> type, String sql, Object... args) {
        Connection con = JdbcUtils.getConnection();
        try {
            return queryRunner.query(con, sql, new BeanHandler<T>(type), args);
        } catch (SQLException e) {
            e.printStackTrace();
        } finally {
            JdbcUtils.close(con);
        }
        return null;
    }

    /**
     * 查询返回多个javaBean的sql语句
     *
     * @param type 返回的对象类型
     * @param sql  执行的sql语句
     * @param args sql对应的参数值
     * @param <T>  返回的类型的泛型
     * @return 如果查询成功并返回一个JavaBean对象列表，将返回该列表。如果查询失败，包括数据库读取失败或执行查询操作时出现异常，将返回null作为失败的标识。
     */
    public <T> List<T> queryForList(Class<T> type, String sql, Object... args) {
        Connection con = JdbcUtils.getConnection();
        try {
            if (queryRunner.query(con, sql, new BeanListHandler<T>(type), args).isEmpty()) {
                return null;
            }
            return queryRunner.query(con, sql, new BeanListHandler<T>(type), args);
        } catch (SQLException e) {
            e.printStackTrace();
        } finally {
            JdbcUtils.close(con);
        }
        return null;
    }

}
